/**
 * 智慧小区管理系统 - Web前端主入口文件
 * @author Wu.Liang
 * @date 2024-01-01
 * @updated 2024-12-21 - 适配新版本技术栈，完善权限控制
 * @updated 2025-01-30 - 添加Element Plus中文国际化配置和getBoundingClientRect修复
 * @updated 2025-01-30 - 修复Element Plus导入方式，改为按需导入，符合《Element Plus组件编码规范权威标准声明.md》规范
 * @updated 2025-01-30 - 修复应用初始化时序，解决页面重复展示问题
 */
import { createApp } from 'vue'
import './styles/index.scss'
import App from './App.vue'
import router from './router'
import { createPinia } from 'pinia'
// 按需导入Element Plus组件，符合《Element Plus组件编码规范权威标准声明.md》规范
// 移除全量导入，使用unplugin-vue-components自动按需导入
import 'element-plus/dist/index.css'
import 'element-plus/theme-chalk/dark/css-vars.css'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import type { Component } from 'vue'
import { permissionComponents } from './components/permission'
import { initGlobalErrorHandler } from './utils/errorHandler'
import { fixElementPlusGetBoundingClientRect, listenElementPlusErrors } from './utils/elementPlusConfig'
import { applyGlobalFix } from './utils/globalFix'

// 立即应用全局修复，在任何其他代码执行之前
console.log('立即应用全局修复...')
applyGlobalFix()

// 立即应用Element Plus修复，在任何其他代码执行之前
console.log('立即应用Element Plus getBoundingClientRect修复...')
fixElementPlusGetBoundingClientRect()

const app = createApp(App)

// 注册Element Plus图标
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
    app.component(key, component as Component)
}

// 配置Pinia
const pinia = createPinia()

app.use(pinia)
app.use(router)
// 移除全量导入Element Plus，使用unplugin-vue-components自动按需导入
// app.use(ElementPlus)

// 初始化用户信息和权限
import { useUserStore } from '@/store/user'
import { usePermissionStore } from '@/store/permission'
import { useAppStore } from '@/store/app'
import { loadTheme, applyTheme, getThemeConfig } from '@/constants/themes'

// 应用初始化函数 - 新增
const initializeApp = async () => {
    console.log('开始应用初始化...')
    
    const userStore = useUserStore()
    const permissionStore = usePermissionStore()
    const appStore = useAppStore()
    
    try {
        // 等待用户信息初始化完成
        const userInitSuccess = await userStore.initUserInfo()
        console.log('用户信息初始化完成:', userInitSuccess)
        
        // 如果用户已登录，等待权限初始化完成
        if (userInitSuccess && userStore.isLogged && userStore.userInfo) {
            const permissionInitSuccess = await permissionStore.initPermissionsFromUserInfo()
            console.log('权限初始化完成:', permissionInitSuccess)
        }
        
        // 标记应用已准备就绪
        appStore.setReady(true)
        console.log('应用初始化完成，应用已就绪')
        
    } catch (error) {
        console.error('应用初始化失败:', error)
        // 即使初始化失败，也要标记应用为就绪状态，避免无限等待
        appStore.setReady(true)
    }
}

// 立即执行函数包装异步初始化 - 修复top-level await问题
;(async () => {
    // 在应用挂载前初始化
    console.log('开始应用初始化流程...')
    await initializeApp()

    // 加载并应用保存的主题
    const savedThemeId = loadTheme()
    const themeConfig = getThemeConfig(savedThemeId)
    applyTheme(themeConfig)
    console.log('应用启动时主题加载完成:', savedThemeId)

    // 注册权限组件和指令
    app.use(permissionComponents)

    // 初始化全局错误处理
    initGlobalErrorHandler()

    // 监听Element Plus错误
    listenElementPlusErrors()

    // 确保修复在DOM加载完成后再次应用
    document.addEventListener('DOMContentLoaded', () => {
      console.log('DOM加载完成，重新应用Element Plus修复...')
      fixElementPlusGetBoundingClientRect()
    })

    // 在应用挂载后再次确保修复生效
    setTimeout(() => {
      console.log('应用挂载后，最终确认Element Plus修复...')
      fixElementPlusGetBoundingClientRect()
    }, 100)

    // 全局错误处理 - 简化版本
    app.config.errorHandler = (err, vm, info) => {
        // 全局修复已经处理了大部分getBoundingClientRect错误
        console.error('Global error:', err, info)
    }

    // 全局警告处理 - 简化版本
    app.config.warnHandler = (msg, vm, trace) => {
        // 全局修复已经过滤了Element Plus相关警告
        console.warn('Global warning:', msg, trace)
    }

    // 在应用挂载前再次确保修复
    app.mount('#app')

    // 应用挂载后的最终修复
    setTimeout(() => {
      console.log('应用完全挂载后，最终修复确认...')
      fixElementPlusGetBoundingClientRect()
    }, 200)
})()
